package com.example.piedrapapeltijeralagartospock;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.xml.parsers.*;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlSerializer;

import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.util.Log;
import android.util.Xml;
import android.view.Menu;

public class PuntuacionesXML {
    private static String FICHERO = "puntuaciones.xml";
    private Context contexto;
    private ListaPuntuaciones lista;
    private boolean cargadaLista;
   
    public PuntuacionesXML(Context contexto) {
          this.contexto = contexto;
          lista = new ListaPuntuaciones();
          cargadaLista = false;
    }

    public void guardarPuntuacion(String jugador1,int puntos1, String jugador2, int puntos2) {
          try {
                 if (!cargadaLista){
                        lista.leerXML(contexto.openFileInput(FICHERO));
                 }
          } catch (FileNotFoundException e) {
          } catch (Exception e) {
                 Log.e("PiedraPapelXML", e.getMessage(), e);
          }
          lista.nuevo(jugador1,puntos1, jugador2, puntos2);
          try {
        	  lista.escribirXML(contexto.openFileOutput(FICHERO, Context.MODE_PRIVATE));
          } catch (Exception e) {
                 Log.e("PiedraPapelXML", e.getMessage(), e);
          }
    }

    public Vector<String> listaPuntuaciones(int cantidad) {
          try {
                 if (!cargadaLista){
                        lista.leerXML(contexto.openFileInput(FICHERO));
                 }
          } catch (Exception e) {
                 Log.e("PiedraPapelXML", e.getMessage(), e);
          }
          return lista.aVectorString();
    }

class ListaPuntuaciones {
	 
    private class Puntuacion {
           String nombre1;
           int puntos1;
           String nombre2;
           int puntos2;
    }

	private List<Puntuacion> listaPuntuaciones;

	public ListaPuntuaciones() {
		listaPuntuaciones = new ArrayList<Puntuacion>();
	}

	public void nuevo(String jugador1,int puntos1, String jugador2, int puntos2) {
		Puntuacion puntuacion = new Puntuacion();
		puntuacion.nombre1 = jugador1;
		puntuacion.puntos1 = puntos1;
		puntuacion.nombre2 = jugador2;
		puntuacion.puntos2 = puntos2;
		listaPuntuaciones.add(puntuacion);
	}

	public Vector<String> aVectorString() {
		Vector<String> result = new Vector<String>();
		for (Puntuacion puntuacion : listaPuntuaciones) {
			result.add(puntuacion.nombre1+": "+puntuacion.puntos1+"/&/"+puntuacion.puntos2+" :"+puntuacion.nombre2);
		}
		return result;
	}

	public void leerXML(InputStream entrada) throws Exception {
		SAXParserFactory fabrica = SAXParserFactory.newInstance();
		SAXParser parser = fabrica.newSAXParser();
		XMLReader lector = parser.getXMLReader();
		ManejadorXML manejadorXML = new ManejadorXML();
		lector.setContentHandler(manejadorXML);
		lector.parse(new InputSource(entrada));
		cargadaLista = true;
	}

	class ManejadorXML extends DefaultHandler {
        private StringBuilder cadena;
        private Puntuacion puntuacion;

        @Override
        public void startDocument() throws SAXException {
               listaPuntuaciones = new ArrayList<Puntuacion>();
               cadena = new StringBuilder();
        }

        @Override
        public void startElement(String uri, String nombreLocal, String nombreCualif, Attributes atr) throws SAXException {
               cadena.setLength(0);
               if (nombreLocal.equals("puntuacion")) {
                      puntuacion = new Puntuacion();
               }
        }

        @Override
        public void characters(char ch[], int comienzo, int lon) {
               cadena.append(ch, comienzo, lon);
        }

        @Override
        public void endElement(String uri, String nombreLocal, String nombreCualif) throws SAXException {
				if (nombreLocal.equals("nombre1")) {
					puntuacion.nombre1 = cadena.toString();
				} else if (nombreLocal.equals("puntos2")) {
					puntuacion.puntos1 = Integer.parseInt(cadena.toString());
				} else if (nombreLocal.equals("nombre2")) {
					puntuacion.nombre2 = cadena.toString();
				} else if (nombreLocal.equals("puntos2")) {
					puntuacion.puntos2 = Integer.parseInt(cadena.toString());
				} else if (nombreLocal.equals("puntuacion")) {
					listaPuntuaciones.add(puntuacion);
				}
			}
 
@Override
         public void endDocument() throws SAXException {
         }
  }
		
		public void escribirXML(OutputStream salida) {
            XmlSerializer serializador = Xml.newSerializer();
            try {
                   serializador.setOutput(salida, "UTF-8");
                   serializador.startDocument("UTF-8", true);
                   serializador.startTag("", "lista_puntuaciones");
                   for (Puntuacion puntuacion : listaPuntuaciones) {
                          serializador.startTag("", "puntuacion");
                          serializador.startTag("", "jugador1");
                          serializador.text(puntuacion.nombre1);
                          serializador.endTag("", "jugador1");
                          serializador.startTag("", "puntos1");
                          serializador.text(String.valueOf(puntuacion.puntos1));
                          serializador.endTag("", "puntos1");
                          serializador.startTag("", "jugador2");
                          serializador.text(puntuacion.nombre2);
                          serializador.endTag("", "jugador2");
                          serializador.startTag("", "puntos2");
                          serializador.text(String.valueOf(puntuacion.puntos2));
                          serializador.endTag("", "puntos2");
                          serializador.endTag("", "puntuacion");
                   }
                   serializador.endTag("", "lista_puntuaciones");
                   serializador.endDocument();
            } catch (Exception e) {
                   Log.e("Asteroides", e.getMessage(), e);
            }
      }
	}
} 
